﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;

namespace AgendaManager.Service
{
    public class SubCarpetaDAO : DAOBase
    {
        static List<string> subCarpetasNombres = new List<string>() 
        {
            "Transporte - Flete",
            "Descarga - Manipulacion - Acopio",
            "Zanja - Entubado - Suelo Nativo",
            "Cama de Asiento",
            "Relleno - Compactación - Riñones",
            "Tapada Superior",
            "Interferencia - Otras Instalaciones",
            "Napa Freática Métodos de Depresión",
            "Bloques de Anclajes",
            "Cámaras de h° - Tramos Cortos",
            "Desalineamiento Vertical y Horizontal",
            "Ajuste Long - Cortes y Biselados",
            "PH - Tapones y Ancajes",
            "Control Deflex y Otros",
            "Reclamos",
            "Comerciales",
            "Otras Maquinas y Equipos"
        };

        internal static List<SubCarpeta> RetrieveEntitiesWhere(object dto, string where)
        {
            List<SubCarpeta> dtos = new List<SubCarpeta>();

            //DataTable dt = GetDataTableWhere(dto, where);

            DataTable dt = new DataTable(dto.GetType().Name);

            try
            {
                string query = @"SELECT SubCarpeta.Id, SubCarpeta.SemanaId,
                                SubCarpeta.Nombre, COUNT(Foto.SubCarpetaId) 'CantFotos'
                                FROM SubCarpeta
                                Left JOIN Foto
                                ON SubCarpeta.Id = Foto.SubCarpetaId
                                WHERE 1=1 AND ";

                //Condición boba para poder agregarle los OR
                //string query = string.Format("SELECT * FROM {0} WHERE 1=1 AND ", dto.GetType().Name);

                if (where != string.Empty)
                {
                    query += where;
                }
                
                //Le saco el AND o el OR que quedó en el final de la query.
                if (query.Trim().EndsWith("AND") || query.Trim().EndsWith("OR"))
                {
                    query = query.Remove(query.Length - 4);
                }

                query += " GROUP BY SubCarpeta.Id, SubCarpeta.Nombre, Foto.SubCarpetaId, SubCarpeta.SemanaId";

                using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(connStr))
                {
                    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(query, con))
                    {
                        con.Open();

                        //Preparo el DataAdapter y DataTable para retornar los datos.
                        System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter();

                        da.SelectCommand = cmd;

                        da.Fill(dt);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }

            if (dt.Rows.Count > 0)
                dtos = LlenarSubCarpeta(dto, dt);

            return dtos;
        }

        private static List<SubCarpeta> LlenarSubCarpeta(object dto, DataTable dt)
        {
            List<SubCarpeta> dtos = new List<SubCarpeta>();

            foreach (DataRow dr in dt.Rows)
            {
                SubCarpeta aux = new SubCarpeta();
                PoblarObjetoDesdeDataRow(aux, dr);

                dtos.Add(aux);
            }

            return dtos;
        }

        internal static bool NuevaSubCarpeta(Semana semana)
        {
            try
            {
                int carpetaId = 0;

                foreach (string subCarpetaNombre in subCarpetasNombres)
                {
                    SubCarpeta subCarpeta = new SubCarpeta();
                    int subCarpetaId = GetNextId(subCarpeta);

                    if (subCarpetaId != 0)
                    {
                        subCarpeta.Id = subCarpetaId;
                        subCarpeta.Nombre = subCarpetaNombre;
                        subCarpeta.SemanaId = semana.Id;

                        CreateEntity(subCarpeta);
                    }
                }
                
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }

        internal static SubCarpeta NuevaSubCarpeta(SubCarpeta subCarpeta)
        {
            try
            {
                int subCarpetaId = GetNextId(subCarpeta);
                if (subCarpetaId != 0)
                {
                    subCarpeta.Id = subCarpetaId;
                    CreateEntity(subCarpeta);
                }

                return subCarpeta;
            }
            catch (Exception)
            {

                throw;
            }
        }

        internal static bool UpdateEntity(object dto)
        {
            try
            {
                return DAOBase.UpdateEntity(dto);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}